/**
 * @brief FIFO测试文件。FIFO单元为struct。
 *        使用函数fifo_write和fifo_read来读写FIFO
 *
 */
#include <stdio.h>
#include <stdlib.h>
//#include <stdint.h>

/*  includes    */
#include "../src/mf_fifo.h"
/*  includes    */

typedef struct
{
    u32 id;
    u8 data[8];
    u8 len;
    u8 ide;
    u8 rsvd[2];
} CANMsg_t;     // 数据结构。FIFO 的单元数据结构

/**< 变量定义 */
#define DATA_SIZE   20U     // 数据 buffer 大小
CANMsg_t buf[DATA_SIZE];    // 定义数据 buffer
/**< 变量定义 */

int main()
{
    uint16_t i = 0U;
    CANMsg_t msg, *pmsg;

    FIFO_t fifo;    // 定义 FIFO

    /*  FIFO 初始化    */
    if(fifo_init(&fifo, buf, sizeof(buf[0]), sizeof(buf)/sizeof(buf[0])) == MF_TRUE)
    {
        printf("FIFO 初始化成功!\n\tunit:%d\t\tsize:%d\n\n",
               fifo_unit(&fifo), fifo_size(&fifo));
    }
    else
    {
        printf("FIFO 初始化失败!\n");
//        getchar();
        return 0U;
    }

    /*  向 FIFO 写数据    */
    printf("FIFO 写数据:\n\tlength:%d\n\n", fifo_len(&fifo));
    while(!FIFO_IS_FULL(&fifo))
    {
        msg.id = 1000U + i;
        msg.data[0] = i;
        msg.data[1] = i+1U;
        msg.data[2] = i+2U;
        msg.data[3] = i+3U;
        msg.data[4] = i+4U;
        msg.data[5] = i+5U;
        msg.data[6] = i+6U;
        msg.data[7] = i+7U;
        msg.len = i;

        if(fifo_write(&fifo, &msg) == MF_TRUE)
        {
            printf("%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\n",
                   msg.id, msg.data[0], msg.data[1], msg.data[2], msg.data[3],
                   msg.data[4], msg.data[5], msg.data[6], msg.data[7], msg.len);
        }
        else
        {
            printf("FIFO 写数据失败!\n\tlength:%d\n", fifo_len(&fifo));
            return 0U;
        }
        i++;
    }
    printf("\n\n\tlength:%d\n", fifo_len(&fifo));

    /*  从 FIFO 读数据    */
    printf("\n\nFIFO 读数据:\n\tlength:%d\n\n", fifo_len(&fifo));
    while(!FIFO_IS_EMPTY(&fifo))
    {
        pmsg = (CANMsg_t *)fifo_read(&fifo);
        if(pmsg != MF_NULL)
        {
            printf("%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\n",
                   pmsg->id, pmsg->data[0], pmsg->data[1], pmsg->data[2], pmsg->data[3],
                   pmsg->data[4], pmsg->data[5], pmsg->data[6], pmsg->data[7], pmsg->len);
        }
        else
        {
            printf("FIFO 读数据失败!\n\tlength:%d\n", fifo_len(&fifo));
            return 0U;
        }
    }
    printf("\n\n\tlength:%d\n", fifo_len(&fifo));

    printf("\n\nFIFO 读写数据成功！\n\tlength:%d\n", fifo_len(&fifo));

    return 0U;
}
